import requests  # 应该是python内置了http请求的库
from typing import Optional
import logging  # Python 内置的 日志模块 logging
from urllib.parse import urlencode  # 内置URL 参数编码函数 urlencode

# 这段代码是 Python 中日志模块的基础配置，作用是定义日志的输出级别、格式，并创建一个专属的日志记录器（Logger）
# 配置日志（对应Java的@Slf4j）
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
logger = logging.getLogger("GetJslCookie")  # 创建一个指定名称的日志记录器

# 业务常量（对应Java的BusinessConstants）
class BusinessConstants:
    HTTP_SUCESS_CODE = 200  # 假设原Java中HTTP成功状态码为200
    COOKIES_LENGTH = 100     # 假设原Java中Cookie长度阈值为100（需根据实际调整）

# 集思录配置类（对应Java的JslConfig，从配置文件/环境变量读取，此处简化为类属性）


class JslConfig:
    def __init__(self):
        # 需替换为实际的集思录登录URL、Origin、Referer（从原Java配置中获取）
        self.login_url = "https://www.jisilu.cn/webapi/account/login_process/"  # 集思录实际登录接口
        self.origin = "https://www.jisilu.cn"
        self.return_url = "https://www.jisilu.cn/"
        self.user_name = "778c501c45a77bf8b7a28850690c293d"
        self.password = "f343f087960b997e56376edaf3db2ddf"



class GetJslCookie:
    def __init__(self):
        # 初始化配置（对应Java的@Autowired注入JslConfig）
        self.jsl_config = JslConfig()
        # 创建requests会话（自动处理连接池，类似Java的CloseableHttpClient）
        self.session = requests.Session()

    def get_cookie(self) -> Optional[str]:  # 表示该函数的返回值可以是字符串类可以是None
        """
        获取集思录登录Cookie
        :return: 提取的有效Cookie值（格式：key=value），失败返回None
        """
        try:
            # 1. 构造请求头（完全对应原Java的request.setHeader）
            headers = {
                "Accept": "application/json, text/javascript, */*; q=0.01",
                "Accept-Encoding": "gzip, deflate, br, zstd",
                "Accept-Language": "zh-CN,zh;q=0.9",
                "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
                "Origin": self.jsl_config.origin,
                "Priority": "u=1, i",
                "Referer": self.jsl_config.return_url,
                "Sec-Ch-Ua": "\"Google Chrome\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
                "Sec-Ch-Ua-Mobile": "?0",
                "Sec-Ch-Ua-Platform": "\"Windows\"",
                "Sec-Fetch-Dest": "empty",
                "Sec-Fetch-Mode": "cors",
                "Sec-Fetch-Site": "same-origin",
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
                "X-Requested-With": "XMLHttpRequest"
            }

            # 2. 构造请求体（对应原Java的StringEntity，使用urlencode自+动处理编码）
            # 注意：原Java中user_name和password是加密后的值，需确认加密逻辑是否一致（此处保留原加密值）
            login_params = {
                "return_url": self.jsl_config.return_url,
                "user_name": self.jsl_config.user_name,  # 原Java中的加密用户名
                "password": self.jsl_config.password,    # 原Java中的加密密码
                "auto_login": 1,
                "aes": 1
            }
            # 编码请求体（application/x-www-form-urlencoded格式）
            request_body = urlencode(login_params, encoding="UTF-8")

            # 3. 发送POST请求（对应原Java的httpClient.execute(request)）
            response = self.session.post(
                url=self.jsl_config.login_url,
                headers=headers,
                data=request_body,  # 发送表单格式数据
                timeout=10  # 超时时间（防止无限等待，单位：秒）
            )

            # 4. 校验响应状态码（对应原Java的statusCode != HTTP_SUCESS_CODE）
            response.raise_for_status()  # 自动抛出4xx/5xx状态码异常
            logger.info(f"登录请求成功，状态码: {response.status_code}")

           
            hearder = response.raw.headers.getlist("Set-Cookie")
            logger.info(f"获取到 {len(hearder)} 个Set-Cookie值：")
            for cookie_header in hearder:
                if len(cookie_header) > BusinessConstants.COOKIES_LENGTH:
                    # 提取到第一个";"前的内容（格式：key=value）
                    valid_cookie = cookie_header.split(";")[0].strip()
                    logger.info(f"成功提取有效Cookie")
                    return valid_cookie

            logger.warning("未找到符合长度要求的Cookie")
            return None

        except requests.exceptions.RequestException as e:
            # 捕获HTTP请求异常（超时、连接失败、4xx/5xx等）
            error_msg = f"获取集思录登录Cookie失败: {str(e)}"
            logger.error(error_msg)
            raise Exception(error_msg)  # 对应原Java的ServiceException
        except Exception as e:
            error_msg = f"获取Cookie过程异常: {str(e)}"
            logger.error(error_msg)
            raise Exception(error_msg)


# ------------------- 测试调用 -------------------
if __name__ == "__main__":
    jsl_cookie_fetcher = GetJslCookie()
    try:
        cookie = jsl_cookie_fetcher.get_cookie()
        if cookie:
            print(f"最终获取的Cookie: {cookie}")
        else:
            print("未获取到有效Cookie")
    except Exception as e:
        print(f"调用失败: {str(e)}")
